//
//  HMHomeViewController.swift
//  HMWeiBo
//
//  Created by Apple on 16/7/28.
//  Copyright © 2016年 itheima. All rights reserved.
//

import UIKit

private let HMHomeViewControllerWithIdentifier = "HMHomeViewControllerWithIdentifier"

class HMHomeViewController: HMBaseTableViewController {

    var isLoading: Bool = false
    
    // 创建一个ViewModel的成员变量
   private lazy var homeViewModel: HMStatusListViewModel = HMStatusListViewModel()
    
    override func viewDidLoad() {
        super.viewDidLoad()


        
        if HMLoginViewModel.shareInstance.isLogin {
            
            // 请求数据
            loadData()
            
            // 注册Cell
            // UITableViewCell.self 就代表他的 class
            self.tableView.registerClass(HMHomeTableViewCell.self, forCellReuseIdentifier: HMHomeViewControllerWithIdentifier)
            
            // 设置自动行高的第一步:
            // 自动计算行高
            self.tableView.rowHeight = UITableViewAutomaticDimension
            // 预估行高
            self.tableView.estimatedRowHeight = 200
            
            // 添加到tableView的footerView上
            self.tableView.tableFooterView = pullView
            
            
            /* The designated initializer
            * This initializes a UIRefreshControl with a default height and width.
            * Once assigned to a UITableViewController, the frame of the control is managed automatically.
            * When a user has pulled-to-refresh, the UIRefreshControl fires its UIControlEventValueChanged event.
            *
            
            UIRefreshControl  -- iOS 6
            1.有一个默认的宽和高
            2.赋值之后才有
            3.UIControlEventValueChanged 才会触发事件
            */
            // 添加系统的下拉刷新
//            refreshControl = UIRefreshControl()
//            
//            // 给下拉刷新添加事件
//            refreshControl?.addTarget(self, action: "loadData", forControlEvents: UIControlEvents.ValueChanged)
            
            
            // 我们把自定义的视图添加到tableView
            // 因为没有给他设置frame,所以什么都没有
            tableView.addSubview(refreshView)
            
            // refreshView是继承自UIControl 也有Target-Action方法
            // 我们需要在 HMRrefreshView 里边去触发它,才能 响应加载数据的方法
            refreshView.addTarget(self, action: "loadData", forControlEvents: UIControlEvents.ValueChanged)
            
            // KVO -> key value observer 就是去观察属性值的变化,发生变化之后会调用一个方法
            // 添加KVO的第一步: 添加一个键值观察者
            /*
                第一个参数: 观察者; 谁是观察者,谁就要实现 一个方法
                第二个参数: 观察对象的属性 
                第三个参数: 新值还是旧值
                第四个参数: 默认填 nil
            */
            
//           tableView.addObserver(self, forKeyPath: "contentOffset", options: NSKeyValueObservingOptions.New, context: nil)
            
            NSNotificationCenter.defaultCenter().addObserver(self, selector: "showBrower:", name: kNotificationShowPhotoBrower, object: nil)
            
        } else {
            
            visitor.setupInfo("visitordiscover_feed_image_house", message: "关注一些人，回这里看看有什么惊喜",isHome:  true)
        }
        
        
    }
    
   //MARK:-- 通知监听方法
    @objc private func showBrower(noti: NSNotification){
        
        // 1. 把通知的信息拿出来
        guard let picurls = noti.userInfo?["picurls"] as? [HMPhotoModel],index = noti.userInfo?["index"] as? Int else {
            return
        }
        
        // 2.
        let brower = HMPhotoBrowerViewController()
        
        brower.pic_urls = picurls
        
        brower.index = index
        
        presentViewController(brower, animated: true) { () -> Void in
            
        }
        
    }
    
    deinit{
        
        // 移除通知
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }
    
    private lazy var pullView: UIActivityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.Gray)
    
    private lazy var refreshView: HMRrefreshView = HMRrefreshView()

}
//MARK:-- 加载数据方法
extension HMHomeViewController {
    
   @objc private func loadData(){
    
    // 20 个
    // 显示一下
    showLoadingView()
        
        /*
        since_id	false	int64	若指定此参数，则返回ID比since_id大的微博（即比since_id时间晚的微博），默认为0。
        max_id	false	int64	若指定此参数，则返回ID小于或等于max_id的微博，默认为0。
        
        
        
        */
        
        var since_id = 0
        var max_id = 0
        
        
        // 下拉刷新的时候
        since_id = homeViewModel.list.first?.statusModel?.id ?? 0
        
        /*
            since_id = 183
            max_id = 150
            同时制定 max_id 和 since_id 是没有数据的
        */
       
        // 当我们上拉更多的时候,指定一下 max_id
        if pullView.isAnimating() {
            
            // 如果 最后一个数据没有id,或者没有 last?.statusModel?.id, 我们就填写一个默认值
            max_id = homeViewModel.list.last?.statusModel?.id ?? 0
           // 不要让 max_id = 0的时候也减去一
             // 由于返回的微博数据,是 等于或者小于 id,所以让id - 1
            if max_id > 0 {
                
                max_id = max_id - 1
                
            }
            
            // 为了确保安全
            since_id = 0
           
            // 4004685314672723
        }
        
        homeViewModel.loadData(since_id,max_id: max_id,success: { () -> () in
            // 加载数据的成功回调
            self.dismissLoadingView()
            // 刷新数据
            self.tableView.reloadData()
            
            
            // 数据加载完成之后,把标记恢复了 
            self.isLoading = false
            
            self.pullView.stopAnimating()
            
            // 加载完成之后,让菊花消失
//            self.refreshControl?.endRefreshing()
            
            self.refreshView.endRefreshing()
            
            // 下拉刷新完成之后,出来一个提示
            self.showCountView()
            
            }) { () -> () in
                // 加载数据失败的回调
                self.showLoadingView("加载数据失败")
                self.isLoading = false
        }
        
    }
    
    private func showCountView(){
        
        let label = UILabel(frame: CGRectMake(0,64 - 44,kUIScreenWidth,44))
        
        label.text = "更新提示"
        
        label.backgroundColor = UIColor.orangeColor()
        
        label.textAlignment = .Center
        
        // 添加到view
        view.addSubview(label)
        
        // 把这个视图插入到 nav
        self.navigationController?.view.insertSubview(label, belowSubview: self.navigationController!.navigationBar)
        
        // 加动画
        UIView.animateWithDuration(2, animations: { () -> Void in
            // y值是让他的y值发生改变
            label.transform = CGAffineTransformMakeTranslation(0, 44)
            }) { (_) -> Void in
                
                // 动画完成之后,再让他回去
                UIView.animateWithDuration(2, animations: { () -> Void in
//                    label.transform = CGAffineTransformMakeTranslation(0, 0)
                    label.transform = CGAffineTransformIdentity
                    }, completion: { (_) -> Void in
                        
                        // 当完成之后, label 隐藏/移除
                        label.removeFromSuperview()
                })
                
        }
        
    }
    
}

//MARK:-- 数据源方法
extension HMHomeViewController {
    
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return homeViewModel.list.count
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        // 一写这个方法,就想到注册cell
        
        let cell = tableView.dequeueReusableCellWithIdentifier(HMHomeViewControllerWithIdentifier, forIndexPath: indexPath)
as! HMHomeTableViewCell
        // 取出索引所对应的数据
      let viewModel =  homeViewModel.list[indexPath.row]
        
//        printLog(viewModel.statusModel?.id)
        
        // 把数据赋值给Cell
       cell.cellViewModel = viewModel

        /*
        1. 当用户滑到最后一个的时候,会走加载数据的方法.
        2. 用户又往上滑了一次,之后,再滑回来,当第一次请求的数据没有返回的时候,会再走一次这个方法,导致 laodData重复调用
        
        解决方案:我们需要做一个标记,来记录一下,我已经加载了数据
            1. 定义标记属性
            2. 借助于现有的 属性或者控件
        */
        //
        
//         !pullView.isAnimating()
        // 根据indexPath 来判断 是否是最后一个Cell
        if indexPath.row == homeViewModel.list.count - 1 && !isLoading{
            
            pullView.startAnimating()
            
            loadData()
            
            // 修改标记
            isLoading = true
        }
        
        return cell
    }
    
    
}
